package com.ruoyi.system.service;

import java.util.Date;
import java.util.List;

import com.ruoyi.common.core.domain.entity.SysUser;

/**
 * 用户 业务层
 *
 * @author ruoyi
 */
public interface ISysUserService {
    /**
     * 根据条件分页查询用户列表
     *
     * @param user 用户信息，用于构建查询条件
     * @return 用户信息集合信息
     */
    public List<SysUser> selectUserList(SysUser user);

    /**
     * 根据条件分页查询已分配用户角色列表
     *
     * @param user 用户信息，用于构建查询条件
     * @return 已分配角色的用户信息集合
     */
    public List<SysUser> selectAllocatedList(SysUser user);

    /**
     * 根据条件分页查询未分配用户角色列表
     *
     * @param user 用户信息，用于构建查询条件
     * @return 未分配角色的用户信息集合
     */
    public List<SysUser> selectUnallocatedList(SysUser user);

    /**
     * 通过用户名查询用户
     *
     * @param userName 用户名
     * @return 对应的用户对象信息；若不存在则返回null
     */
    public SysUser selectUserByUserName(String userName);

    /**
     * 通过用户ID查询用户
     *
     * @param userId 用户ID
     * @return 对应的用户对象信息；若不存在则返回null
     */
    public SysUser selectUserById(Long userId);

    /**
     * 根据用户名查询该用户所属的角色组名称字符串
     *
     * @param userName 用户名
     * @return 角色组名称组成的字符串，多个角色用逗号分隔
     */
    public String selectUserRoleGroup(String userName);

    /**
     * 根据用户名查询该用户所属的岗位组名称字符串
     *
     * @param userName 用户名
     * @return 岗位组名称组成的字符串，多个岗位用逗号分隔
     */
    public String selectUserPostGroup(String userName);

    /**
     * 校验用户名称是否唯一
     *
     * @param user 包含待校验用户名的用户对象
     * @return true表示用户名唯一可用，false表示重复不可用
     */
    public boolean checkUserNameUnique(SysUser user);

    /**
     * 校验手机号码是否唯一
     *
     * @param user 包含待校验手机号的用户对象
     * @return true表示手机号唯一可用，false表示重复不可用
     */
    public boolean checkPhoneUnique(SysUser user);

    /**
     * 校验email是否唯一
     *
     * @param user 包含待校验邮箱地址的用户对象
     * @return true表示邮箱唯一可用，false表示重复不可用
     */
    public boolean checkEmailUnique(SysUser user);

    /**
     * 校验指定用户是否允许被操作（如不能修改管理员等）
     *
     * @param user 待校验的用户对象
     */
    public void checkUserAllowed(SysUser user);

    /**
     * 校验当前用户对目标用户是否有数据权限访问
     *
     * @param userId 目标用户的ID
     */
    public void checkUserDataScope(Long userId);

    /**
     * 新增用户信息到数据库中
     *
     * @param user 要新增的用户对象
     * @return 受影响的记录数
     */
    public int insertUser(SysUser user);

    /**
     * 注册新用户（通常用于前台注册流程）
     *
     * @param user 要注册的用户对象
     * @return 成功返回true，失败返回false
     */
    public boolean registerUser(SysUser user);

    /**
     * 修改已有用户的信息
     *
     * @param user 包含更新后信息的用户对象
     * @return 受影响的记录数
     */
    public int updateUser(SysUser user);

    /**
     * 给指定用户授予角色权限
     *
     * @param userId  用户ID
     * @param roleIds 角色ID数组
     */
    public void insertUserAuth(Long userId, Long[] roleIds);

    /**
     * 修改用户的状态（启用/禁用）
     *
     * @param user 包含用户ID及状态字段的对象
     * @return 受影响的记录数
     */
    public int updateUserStatus(SysUser user);

    /**
     * 修改用户的基本资料（如昵称、性别等）
     *
     * @param user 包含基本资料更新内容的用户对象
     * @return 受影响的记录数
     */
    public int updateUserProfile(SysUser user);

    /**
     * 修改用户的头像图片路径
     *
     * @param userId 用户ID
     * @param avatar 头像文件存储路径或URL
     * @return 成功返回true，失败返回false
     */
    public boolean updateUserAvatar(Long userId, String avatar);

    /**
     * 更新用户的最近一次登录时间和IP地址
     *
     * @param userId    用户ID
     * @param loginIp   登录时使用的IP地址
     * @param loginDate 登录发生的时间戳
     */
    public void updateLoginInfo(Long userId, String loginIp, Date loginDate);

    /**
     * 重置用户密码为默认值或其他逻辑处理后的结果
     *
     * @param user 包含用户ID及其他必要信息的用户对象
     * @return 受影响的记录数
     */
    public int resetPwd(SysUser user);

    /**
     * 使用明文密码直接设置用户的新密码
     *
     * @param userId   用户ID
     * @param password 明文密码字符串
     * @return 受影响的记录数
     */
    public int resetUserPwd(Long userId, String password);

    /**
     * 删除单个用户信息
     *
     * @param userId 要删除的用户ID
     * @return 受影响的记录数
     */
    public int deleteUserById(Long userId);

    /**
     * 批量删除多个用户信息
     *
     * @param userIds 需要删除的用户ID数组
     * @return 受影响的记录数
     */
    public int deleteUserByIds(Long[] userIds);

    /**
     * 导入一批用户数据，并根据配置决定是插入还是更新
     *
     * @param userList        待导入的用户列表
     * @param isUpdateSupport 是否支持更新已有用户：true表示可以覆盖更新，false仅插入新用户
     * @param operName        当前执行此操作的操作员姓名
     * @return 导入结果描述字符串（成功条数、失败原因等）
     */
    public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName);
}
